package com.qf.controller;

import com.qf.utils.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
  * @author 汤奇
 * @version V1.0
 * @Project BookPro
 * @Package com.qf.controller
 * @Description: 公共基础servlet
 * @Date 2022/5/20 14:38
 */
public class BaseServlet extends HttpServlet {

    /**
     * 所有的请求都会进入到这个方法中, 这个方法中通过反射机制来动态执行具体的业务方法
     * get请求, post请求,delete请求都会经过这个service方法
     * */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求参数(标识符,方法名)
        String methodStr = req.getParameter(Constants.TAG);

        //2.如果method没有获取到值,我们就跳转到首页
        if (methodStr == null || "".equals(methodStr)){
            methodStr = Constants.INDEX;
        }

        //3. 反射调用对应的业务逻辑方法
        //获取class类
        Class clazz = this.getClass();

        try {
            //4.从类中获取对象方法
            Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);

            //5.执行从类中获取到的方法对象,接收方法执行结果
            Object result = method.invoke(this, req, resp);

            //6.根据返回的结果进行判断,判断返回值不为空
            if (result != null) {
                //jump获取到后 例如:"forward:http://localhost:8080/admin/admin.jsp"
                String  jump = (String) result;

                if (jump.startsWith(Constants.FORWARD)){
                    //7. 判断执行后是请求转发处理
                    //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);

                    //执行请求转发
                    req.getRequestDispatcher(path).forward(req,resp);
                } else if (jump.startsWith(Constants.REDIRECT)){
                    //8.判断执行后是重定向处理
                    //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                    String path = jump.substring(jump.indexOf(Constants.FLAG) + 1);
                    //执行重定向
                    resp.sendRedirect(path);
                } else {
                    //9. 判断如果是其他类型的返回值, 那么通过流写回到浏览器页面
                    resp.getWriter().println(jump);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
